struct Solution {}

impl Solution {
  pub fn valid_tic_tac_toe(board: Vec<String>) -> bool {
    let mut x_num = 0;
    let mut o_num = 0;
    let mut hori_board = [' '; 9];
    let mut index = 0;
    board.iter().for_each(|row| {
      row.chars().for_each(|c| {
        hori_board[index] = c;
        index += 1;
        match c {
            'X' => {
              x_num += 1;
            }
            'O' => {
              o_num += 1;
            }
            _ => {}
        }
      });
    });
    if o_num > x_num || (x_num == 0 && o_num == 1) || x_num - o_num > 1 {
      return false;
    }
    let mut winner = 'N';
    for i in 0..3 {
      let temp = hori_board[i*3];
      if temp != ' ' && temp == hori_board[i*3 + 1] && temp == hori_board[i*3 + 2] {
        if winner != 'N' && winner != temp  {
          return false;
        }
        winner = temp;
      }
      match hori_board[i] {
        ' ' => {

        }
        str => {
          match i {
            0 => {
              if (hori_board[0] == hori_board[3] && str == hori_board[6]) || (hori_board[0] == hori_board[4] && str == hori_board[8]) {
                if winner != 'N' && winner != str {
                  return false;
                }
                winner = str;
              }
            }
            1 => {
              if hori_board[1] == hori_board[4] && str == hori_board[7] {
                if winner != 'N' && winner != str {
                  return false;
                }
                winner = str;
              }
            }
            2 => {
              if (hori_board[2] == hori_board[5] && str == hori_board[8]) || (hori_board[2] == hori_board[4] && str == hori_board[6]) {
                if winner != 'N' && winner != str {
                  return false;
                }
                winner = str;
              }
            }
            _ => {

            }
          }
        }
      }
    }
    if (winner == 'X' && o_num == x_num) || (winner == 'O' && x_num > o_num) {
      return false;
    }
    return true;
  }
}